﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BussinesCosea
{
    public partial class CoseaDirectos : IDisposable
    {
        public void AgregaAusencia(AusenciaEmpleado ausencia)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.AusenciaEmpleados.InsertOnSubmit(ausencia);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar ausencia " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaAusencia(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                AusenciaEmpleado au = db.AusenciaEmpleados.Single(c => c.IdAusencia == id);
                db.AusenciaEmpleados.DeleteOnSubmit(au);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar ausencia " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaRetardo(RetardoEmpleado retardo)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.RetardoEmpleados.InsertOnSubmit(retardo);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar retardo " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaRetardo(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                RetardoEmpleado re = db.RetardoEmpleados.Single(c => c.IdRetardo == id);
                db.RetardoEmpleados.DeleteOnSubmit(re);                
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar retardo " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaIncapacidad(IncapacidadEmpleado incapacidad)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.IncapacidadEmpleados.InsertOnSubmit(incapacidad);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar incapacidad " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaIncapacidad(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);                
                IncapacidadEmpleado inca = db.IncapacidadEmpleados.Single(c => c.IdIncapacidad == id);
                db.IncapacidadEmpleados.DeleteOnSubmit(inca);                
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar incapacidad " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaBaja(BajaEmpleado baja)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);                
                db.BajaEmpleados.InsertOnSubmit(baja);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar baja " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaBaja(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                BajaEmpleado bj = db.BajaEmpleados.Single(c => c.IdBaja == id);
                db.BajaEmpleados.DeleteOnSubmit(bj);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar baja " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaVacaciones(VacacionesEmpleado vacacion)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.VacacionesEmpleados.InsertOnSubmit(vacacion);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar vacaciones " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaVaciones(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                VacacionesEmpleado va = db.VacacionesEmpleados.Single(c => c.IdVacacionEmpleado == id);
                db.VacacionesEmpleados.DeleteOnSubmit(va);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar vacaciones " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaMaterialesEmpleado(MaterialEmpleado mate)
        {
            try
            {                
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.MaterialEmpleados.InsertOnSubmit(mate);                
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar AgregaMaterialesEmpleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaMaterialesEmpleado(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                MaterialEmpleado ma = db.MaterialEmpleados.Single(c => c.IdMaterialEmpleado == id);
                db.MaterialEmpleados.DeleteOnSubmit(ma);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar materiales empleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaSalarioEmpleado(SalarioEmpleado sala)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.SalarioEmpleados.InsertOnSubmit(sala);
                Empleado em = db.Empleados.Single(c => c.IdEmpleado == sala.IdEmpleado);
                em.SalarioDiario = sala.SueldoDiarioNuevo;
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar AgregaSalarioEmpleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }


        public void EliminaSalarioEmpleado(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                SalarioEmpleado sa = db.SalarioEmpleados.Single(c => c.IdSalarioEmpleado == id);                
                db.SalarioEmpleados.DeleteOnSubmit(sa);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar salario empleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaPuestoEmpleado(PuestoEmpleado psto)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.PuestoEmpleados.InsertOnSubmit(psto);                
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar AgregaPuestoEmpleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaPuestoEmpleado(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                PuestoEmpleado pu = db.PuestoEmpleados.Single(c => c.IdPuestoEmpleado == id);
                db.PuestoEmpleados.DeleteOnSubmit(pu);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar puesto empleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaCapacitacionEmpleado(CapacitacionEmpleado capa)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.CapacitacionEmpleados.InsertOnSubmit(capa);                
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar AgregaCapacitacionEmpleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaCapacitacionEmpleado(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                CapacitacionEmpleado ca = db.CapacitacionEmpleados.Single(c => c.IdCapacitacionEmpleado == id);
                db.CapacitacionEmpleados.DeleteOnSubmit(ca);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar capacitacion empleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void AgregaReconocimientoEmpleado(ReconocimientoEmpleado reco)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                db.ReconocimientoEmpleados.InsertOnSubmit(reco);  
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al agregar AgregaReconocimientoEmpleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EliminaReconocimientoEmpleado(int id)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                ReconocimientoEmpleado re = db.ReconocimientoEmpleados.Single(c => c.IdRecoEmp == id);
                db.ReconocimientoEmpleados.DeleteOnSubmit(re);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                throw new Exception("Error al eliminar reconocimiento empleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public void EstadoEmpleado(int idEmpleado, int idEstado)
        {

            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                BitacoraEmpleado bEmp = new BitacoraEmpleado();
                bEmp.IdEmpleado = idEmpleado;
                bEmp.IdEstado = idEstado;
                bEmp.FechaHoraModificacion = DateTime.Now;
                if (_usuarioFirmado == null)
                    bEmp.IdUsuario = 1; //Usuario por default o principal del sistema
                else
                    bEmp.IdUsuario = _usuarioFirmado.idUsuario;
                db.BitacoraEmpleados.InsertOnSubmit(bEmp);
                db.SubmitChanges();
            }
            catch (Exception ex)
            {

                throw new Exception("Error al EstadoEmpleado " + ex.Message);
            }
            finally
            {
                db = null;
            }

        }

        public void ModificaEstadoEmpleado(int idEmpleado, int idEstado, string NumEmpleado)
        {
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                Empleado emp = db.Empleados.Single(c => c.IdEmpleado == idEmpleado);
                emp.IdEstadoEmpleado = idEstado;
                emp.NumeroEmpleado = NumEmpleado;

                //Arreglar el webservice de fondo

                //if (idEstado == 4)
                //{
                //    db.spCambiaEstatusWebService(NumEmpleado, "Baja");
                //}

                //if (idEstado == 2)
                //{
                //    db.spCambiaEstatusWebService(NumEmpleado, "Activo");
                //    db.spInsertaRegWS(NumEmpleado, idEmpleado.ToString());
                //}

                
                db.SubmitChanges();

                EstadoEmpleado(idEmpleado, idEstado);
            }
            catch (Exception ex)
            {

                throw new Exception("Error al ModificaEstadoEmpleado " + ex.Message);
            }
            finally
            {
                db = null;
            }
            
        }

        public void ActualizaDatosEmpleadoComplemento(int idEmpleado, EmpleadoComplemento eComplemento)
        {
            EmpleadoComplemento eCom;
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);


                db.ExecuteCommand("delete from EmpleadoComplemento where idempleado = {0}", idEmpleado);

                eCom = (from x in db.EmpleadoComplementos
                        where x.IdEmpleado == idEmpleado
                        select x).SingleOrDefault();

                if (eCom == null)
                {
                    eComplemento.IdEmpleado = idEmpleado;
                    db.EmpleadoComplementos.InsertOnSubmit(eComplemento);
                }
                else
                {                    
                    //eCom = db.EmpleadoComplementos.Single(c => c.IdEmpleado == idEmpleado);
                    //eCom.idEmpleadoComplemento = eCom.idEmpleadoComplemento;
                    //eCom.IdEmpleado = idEmpleado;
                    eCom.CodigoDepto = eComplemento.CodigoDepto;
                    eCom.CodigoEstacionTrabajo = eComplemento.CodigoEstacionTrabajo;
                    eCom.CodigoProyecto = eComplemento.CodigoProyecto;
                    eCom.CodigoTrabajo = eComplemento.CodigoTrabajo;
                    eCom.Contrato = eComplemento.Contrato;
                    eCom.Departamento = eComplemento.Departamento;
                    eCom.Depto = eComplemento.Depto;
                    eCom.Empleado = eComplemento.Empleado;
                    eCom.HoraSemana = eComplemento.HoraSemana;
                    eCom.JobPosCodeEfe = eComplemento.JobPosCodeEfe;
                    eCom.JobPosition = eComplemento.JobPosition;
                    eCom.Labor = eComplemento.Labor;
                    eCom.Localizacion = eComplemento.Localizacion;
                    eCom.Pais = eComplemento.Pais;
                    eCom.PayRoll = eComplemento.PayRoll;
                    eCom.Planta = eComplemento.Planta;
                    eCom.PlantaEfectiva = eComplemento.PlantaEfectiva;
                    eCom.RazonSalario = eComplemento.RazonSalario;
                    eCom.Salario = eComplemento.Salario;
                    eCom.SalarioEfectivo = eComplemento.SalarioEfectivo;
                    eCom.SalarioHora = eComplemento.SalarioHora;
                    eCom.SalarioMensual = eComplemento.SalarioMensual;
                    eCom.SendioDate = eComplemento.SendioDate;
                    eCom.Supervisor = eComplemento.Supervisor;
                    eCom.Turno = eComplemento.Turno;
                }
                db.SubmitChanges();
            }
            catch (Exception ex)
            {

                throw new Exception("Error al ActualizaDatosEmpleadoComplemento " + ex.Message);
            }
            finally
            {
                db = null;
            }
        }

        public EmpleadoComplemento ObtenEmpleadoComplemento(int idEmpleado)
        {
            EmpleadoComplemento eCom;
            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);

                eCom = (from x in db.EmpleadoComplementos
                                            where x.IdEmpleado == idEmpleado
                                            select x).SingleOrDefault();
            }
            catch (Exception ex)
            {

                throw new Exception("Error al ObtenEmpleadoComplemento " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return eCom;
        }

        public List<ObtenAusenciasResult> ObtenAusencias(int idEmpleado)
        {
            List<ObtenAusenciasResult> res = new List<ObtenAusenciasResult>();

            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);

                res = db.ObtenAusencias(idEmpleado).ToList<ObtenAusenciasResult>();                

            }
            catch (Exception ex)
            {

                throw new Exception("Error al ObtenAusencias " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenRetardosResult> ObtenRetardos(int idEmpleado)
        {
            List<ObtenRetardosResult> res = new List<ObtenRetardosResult>();

            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);

                res = db.ObtenRetardos(idEmpleado).ToList<ObtenRetardosResult>();

            }
            catch (Exception ex)
            {

                throw new Exception("Error al ObtenRetardos " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenIncapacidadesResult> ObtenIncapacidades(int idEmpleado)
        {
            List<ObtenIncapacidadesResult> res = new List<ObtenIncapacidadesResult>();


            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);

                //ObtenIncapacidadesResult c = new ObtenIncapacidadesResult();
                
                res = db.ObtenIncapacidades(idEmpleado).ToList<ObtenIncapacidadesResult>();                
                
            }
            catch (Exception ex)
            {

                throw new Exception("Error al ObtenIncapacidades " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenBajasResult> ObtenBajas(int idEmpleado)
        {
            List<ObtenBajasResult> res = new List<ObtenBajasResult>();
            

            try
            {                
                db = new bdCoseaDirectosDataContext(_cadenaConexion);

                res = db.ObtenBajas(idEmpleado).ToList<ObtenBajasResult>();

            }
            catch (Exception ex)
            {

                throw new Exception("Error al ObtenBajas " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenVacacionesResult> ObtenVacaciones(int idEmpleado)
        {
            List<ObtenVacacionesResult> res = new List<ObtenVacacionesResult>();

            try
            {                
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                res = db.ObtenVacaciones(idEmpleado).ToList<ObtenVacacionesResult>();

            }
            catch (Exception ex)
            {

                throw new Exception("Error al ObtenVacaciones " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenMaterialesEmpResult> ObtenMaterialesEmp(int idEmpleado)
        {
            List<ObtenMaterialesEmpResult> res = new List<ObtenMaterialesEmpResult>();

            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                res = db.ObtenMaterialesEmp(idEmpleado).ToList<ObtenMaterialesEmpResult>();

            }
            catch (Exception ex)
            {
                throw new Exception("Error al ObtenMaterialesEmp " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenSalarioEmpResult> ObtenSalarioEmp(int idEmpleado)
        {
            List<ObtenSalarioEmpResult> res = new List<ObtenSalarioEmpResult>();

            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                res = db.ObtenSalarioEmp(idEmpleado).ToList<ObtenSalarioEmpResult>();

            }
            catch (Exception ex)
            {
                throw new Exception("Error al ObtenSalarioEmp " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenPuestoEmpResult> ObtenPuestoEmp(int idEmpleado)
        {
            List<ObtenPuestoEmpResult> res = new List<ObtenPuestoEmpResult>();

            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                res = db.ObtenPuestoEmp(idEmpleado).ToList<ObtenPuestoEmpResult>();

            }
            catch (Exception ex)
            {
                throw new Exception("Error al ObtenPuestoEmp " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenCapacitacionEmpResult> ObtenCapacitacionEmp(int idEmpleado)
        {
            List<ObtenCapacitacionEmpResult> res = new List<ObtenCapacitacionEmpResult>();

            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                res = db.ObtenCapacitacionEmp(idEmpleado).ToList<ObtenCapacitacionEmpResult>();

            }
            catch (Exception ex)
            {
                throw new Exception("Error al ObtenCapacitacionEmp " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }

        public List<ObtenReconociEmpResult> ObtenReconocimientoEmp(int idEmpleado)
        {
            List<ObtenReconociEmpResult> res = new List<ObtenReconociEmpResult>();

            try
            {
                db = new bdCoseaDirectosDataContext(_cadenaConexion);
                res = db.ObtenReconociEmp(idEmpleado).ToList<ObtenReconociEmpResult>();

            }
            catch (Exception ex)
            {
                throw new Exception("Error al ObtenReconocimientoEmp " + ex.Message);
            }
            finally
            {
                db = null;
            }


            return res;
        }
        
    }
}
